//
//  ViewController.m
//  定时器
//
//  Created by apple on 15/8/30.
//  Copyright (c) 2015年 戴维营. All rights reserved.
//

#import "ViewController.h"

@interface ViewController ()

{
    dispatch_source_t timer;

}
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
//    定时器（NSTimer）
    
//    在预设的时间过后执行一个动作或者每隔多久就执行一个动作；

#if 0
//   1、 创建定时器并启动；
    
    NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(didAbc) userInfo:nil repeats:YES];
    
#endif
    
#if 0
    
//    2、创建定时器，但不启动；
    NSTimer *timer = [NSTimer timerWithTimeInterval:1.0 target:self selector:@selector(didAbc) userInfo:nil repeats:YES];
    
//       监听定时器启动；
    [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];
    
//    上面的 “1”就相当于对“2”这两个步骤进行了封装；
    
#endif
    
    
#if 0
    
//    可以设置第一次触发的时间；
    NSTimer *timer = [NSTimer timerWithTimeInterval:1.0 target:self selector:@selector(didAbc) userInfo:nil repeats:YES];
    
//    3秒后触发；
    [timer setFireDate:[NSDate dateWithTimeIntervalSinceNow:3]];
     
//     监听定时器启动；
    [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];
#endif
    
#if 0
    
//    定时器（ CADispalyLink）
    
//    NSTimer精度较低，大概在50～100ms，并且会被其他打任务影响到，并不会保证每次都会精确触发；
    
//    获取一个与屏幕刷新率绑定的定时器，ios默认为60帧每秒；
    
    CADisplayLink *dispalyLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(didAbc)];
    
//    默认为1，每隔10帧触发一次；
    
    dispalyLink.frameInterval = 10;
    [dispalyLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
    
    //    调用间隔 ＝ frameinterval／帧率
    
//    停止监听
    [dispalyLink removeFromRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
    
//    停止记时；
    [dispalyLink invalidate];

    
//    CADispalyLink的触发事件与屏幕的刷新率有关，默认刷新频率为1/60秒，比较精确，CPU忙碌的时候有可能降低刷新率，并且跳过一些触发。一般用语需要刷新界面的操作，在动画和游戏中使用较多；
    
#endif
    
//------------------------------------------------------------------

#if 0
    
//    定时器（GCD）一种更加精确的定时器；
    
//    10s后执行，第二个参数单位为纳秒
    
//    NSEC_PEC_SEC: 纳秒每秒；
   
    dispatch_time_t ti = dispatch_time(DISPATCH_TIME_NOW, 10 * NSEC_PER_SEC);
    dispatch_after(ti, dispatch_get_main_queue(), ^{
        NSLog(@"10秒后");
    });
    
#endif
   
//    ------------------------------------------------------------
//    dispatch_source_t timer;
    
#if 1
//    更加精确一点的定时器；
    timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, dispatch_get_main_queue());
    
//    设置定时器，每隔一秒触发，总共执行100秒；
    
    dispatch_source_set_timer(timer, DISPATCH_TIME_NOW, 1 * NSEC_PER_SEC, 100 * NSEC_PER_SEC);
    
//    设置定时器触发执行的block；
    
    dispatch_source_set_event_handler(timer, ^{
        NSLog(@"hi");
    });
//    启动定时器；
    
    dispatch_resume(timer);
    
    
#endif
    // Do any additional setup after loading the view, typically from a nib.
}

- (void)didAbc
{
    NSLog(@"hi");
}
- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end
